/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package documenteditor.entidade.model;

import documenteditor.entidade.model.dominio.TipoPonto;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.ForeignKey;

/**
 *
 * @author gleidson.moura
 */
@Entity
@Table(name="PRODUTO")
@SequenceGenerator(name="GEN_PRODUTO", sequenceName="GEN_PRODUTO_ID")
public class Produto implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator="GEN_PRODUTO")
    @Column(name="ID_PRODUTO")
    private Long idProduto;

    @Column(name="DESCRICAO", nullable=false)
    private String descricao;

    @Column(name="CODIGO_EAN", nullable=true)
    private String codigoEAN;

    @Column(name="ATIVO", nullable=false)
    private Boolean ativo;

    @Column(name="PRECO_CUSTO", scale=2, nullable=false)
    private Long precoCusto;

    @Column(name="TIPO_PONTO", nullable=false)
    @Enumerated(EnumType.STRING)
    private TipoPonto tipoPonto;

    @ManyToOne(targetEntity=GrupoProduto.class, fetch=FetchType.LAZY)
    @JoinColumn(name = "ID_GRUPO_PRODUTO", nullable=false)
    @ForeignKey(name="FK_PRODUTO_GRUPO_PRODUTO")
    private GrupoProduto grupoProduto;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "idProdutoVenda.produto",
               cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
              org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
    private List<ProdutoVenda> produtoVenda = new LinkedList<ProdutoVenda>();

    public Long getIdProduto() {
        return idProduto;
    }

    public void setIdProduto(Long idProduto) {
        this.idProduto = idProduto;
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    public String getCodigoEAN() {
        return codigoEAN;
    }

    public void setCodigoEAN(String codigoEAN) {
        this.codigoEAN = codigoEAN;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public GrupoProduto getGrupoProduto() {
        return grupoProduto;
    }

    public void setGrupoProduto(GrupoProduto grupoProduto) {
        this.grupoProduto = grupoProduto;
    }

    public Long getPrecoCusto() {
        return precoCusto;
    }

    public void setPrecoCusto(Long precoCusto) {
        this.precoCusto = precoCusto;
    }

    public List<ProdutoVenda> getProdutoVenda() {
        return produtoVenda;
    }

    public void setProdutoVenda(List<ProdutoVenda> produtoVenda) {
        this.produtoVenda = produtoVenda;
    }

    public TipoPonto getTipoPonto() {
        return tipoPonto;
    }

    public void setTipoPonto(TipoPonto tipoPonto) {
        this.tipoPonto = tipoPonto;
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idProduto != null ? idProduto.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Produto)) {
            return false;
        }
        Produto other = (Produto) object;
        if ((this.idProduto == null && other.idProduto != null) || (this.idProduto != null && !this.idProduto.equals(other.idProduto))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "documenteditor.entidade.model.Produto[id=" + idProduto + "]";
    }

}
